home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 007 / x68000.arc / SOURCE.ARC / OPERATIO.MOD < prev    next >
Text File  |  1986-01-21  |  5KB  |  156 lines

  1. IMPLEMENTATION MODULE OperationCodes;
  2. (* Initializes lookup table for Mnemonic OpCodes.  Searches the table *)
  3. (* and returns the bit pattern along with address mode information.   *)
  4.  
  5.    FROM SYSTEM IMPORT
  6.       ADR, TSIZE;
  7.  
  8.    FROM FileSystem IMPORT
  9.       File, Response, Lookup, ReadNBytes, Close;
  10.  
  11.    FROM Terminal IMPORT
  12.       WriteString, WriteLn;
  13.  
  14.    FROM Strings IMPORT
  15.       CompareStr;
  16.  
  17.    FROM Parser IMPORT
  18.       TOKEN, STRING;
  19.  
  20.    FROM ErrorX68 IMPORT
  21.       ErrorType, Error;
  22.  
  23.  
  24.    CONST
  25.       FIRST = 1;       (* First 68000 OpCode *)
  26.       LAST = 118;      (* Last 68000 OpCode *)
  27.  
  28.  
  29. (*---
  30. (* These objects are declared in the DEFINITION MODULE *)
  31.  
  32.    TYPE
  33.       ModeTypeA = (RegMem3,      (* 0 = Register, 1 = Memory *)
  34.                    Ry02,         (* Register Rx -- Bits 0-2 *)
  35.                    Rx911,        (* Register Ry -- Bits 9-11 *)
  36.                    Data911,      (* Immediate Data -- Bits 9-11 *)
  37.                    CntR911,      (* Count Register or Immediate Data *)
  38.                    Brnch,        (* Relative Branch *)
  39.                    DecBr,        (* Decrement and Branch *)
  40.                    Data03,       (* Used for VECT only *)
  41.                    Data07,       (* MOVEQ *)
  42.                    OpM68D,       (* Data *)
  43.                    OpM68A,       (* Address *)
  44.                    OpM68C,       (* Compare *)
  45.                    OpM68X,       (* XOR *)
  46.                    OpM68S,       (* Sign Extension *)
  47.                    OpM68R,       (* Register/Memory *)    
  48.                    OpM37);       (* Exchange Registers *)
  49.                    
  50.       ModeTypeB = (Bit811,       (* BIT operations - bits 8/11 as switch *)
  51.                    Size67,       (* 00 = Byte, 01 = Word, 10 = Long *)
  52.                    Size6,        (* 0 = Word, 1 = Long *)
  53.                    Size1213A,    (* 01 = Byte, 11 = Word, 10 = Long *)
  54.                    Size1213,     (* 11 = Word, 10 = Long *)
  55.                    Exten,        (* OpCode extension required *)
  56.                    EA05a,        (* Effective Address - ALL *)
  57.                    EA05b,        (* Less 1 *)
  58.                    EA05c,        (* Less 1, 11 *)
  59.                    EA05d,        (* Less 9, 10, 11 *)
  60.                    EA05e,        (* Less 1, 9, 10, 11 *)
  61.                    EA05f,        (* Less 0, 1, 3, 4, 11 *)
  62.                    EA05x,        (* Dual mode - OR/AND *)
  63.                    EA05y,        (* Dual mode - ADD/SUB *)
  64.                    EA05z,        (* Dual mode - MOVEM *)
  65.                    EA611);       (* Used only by MOVE *)
  66.                    
  67.       ModeA = SET OF ModeTypeA;
  68.       ModeB = SET OF ModeTypeB;
  69.  
  70.                                                             ---*)
  71.    TYPE
  72.       TableRecord = RECORD
  73.                        Mnemonic : TOKEN;
  74.                        Op : BITSET;
  75.                        AddrModeA : ModeA;
  76.                        AddrModeB : ModeB;
  77.                     END;
  78.  
  79.  
  80.    VAR
  81.       Table68K : ARRAY [FIRST..LAST] OF TableRecord;
  82.       i : CARDINAL;   (* index variable for initializing Table68K *)
  83.       d : CARDINAL;  (* dummy for ReadNBytes *)
  84.       f : File;
  85.  
  86.  
  87.    PROCEDURE Instructions (MnemonSym : TOKEN; 
  88.                            OpLoc : CARDINAL; VAR Op : BITSET; 
  89.                            VAR AddrModeA : ModeA; VAR AddrModeB : ModeB);
  90.    (* Uses lookup table to find addressing mode & bit pattern of opcode. *)
  91.  
  92.       CONST
  93.          GoLower = -1;
  94.          GoHigher = +1;
  95.  
  96.       VAR
  97.          Top, Bottom, Look : CARDINAL;   (* index to Op-code table *)
  98.          Found : BOOLEAN;
  99.          Search : INTEGER;
  100.  
  101.       BEGIN
  102.          Bottom := FIRST;
  103.          Top := LAST;
  104.          Found := FALSE;
  105.          
  106.          REPEAT   (* Binary Search *)
  107.             Look := (Bottom + Top) DIV 2;
  108.             Search := CompareStr (MnemonSym, Table68K[Look].Mnemonic);
  109.            
  110.             IF Search = GoLower THEN
  111.                Top := Look - 1;
  112.             ELSIF Search = GoHigher THEN
  113.                Bottom := Look + 1;
  114.             ELSE   (* Got It! *)
  115.                Found := TRUE;
  116.             END;
  117.          UNTIL (Top < Bottom) OR Found;
  118.  
  119.          IF Found THEN
  120.             (* Return the instruction, mode, and address restristictions *)
  121.             Op := Table68K[Look].Op;
  122.             AddrModeA := Table68K[Look].AddrModeA;
  123.             AddrModeB := Table68K[Look].AddrModeB;
  124.          ELSE
  125.             Error (OpLoc, NoCode);
  126.          END;
  127.       END Instructions;
  128.  
  129.  
  130. BEGIN   (* MODULE Initialization *)
  131.    Lookup (f, "OPCODE.DAT", FALSE);   (* Try default drive first *)
  132.    IF f.res # done THEN
  133.       Lookup (f, "A:OPCODE.DAT", FALSE);
  134.       IF f.res # done THEN
  135.          Lookup (f, "B:OPCODE.DAT", FALSE);
  136.          IF f.res # done THEN
  137.             WriteString ("Can't Find 'OPCODE.DAT'.");
  138.             WriteLn;
  139.             HALT;
  140.          END;
  141.       END;
  142.    END;
  143.  
  144.    FOR i := FIRST TO LAST DO
  145.       ReadNBytes (f, ADR (Table68K[i]), TSIZE (TableRecord), d);
  146.    END;
  147.  
  148.    Close (f);
  149.    IF f.res # done THEN
  150.       (* Don't worry about it! *)
  151.    END;
  152. END OperationCodes.
  153.  
  154.  
  155.  
  156.